package bank.sys;

import java.util.Date;
import java.util.regex.Pattern;
import java.util.Scanner;
import java.text.SimpleDateFormat;
import java.text.DecimalFormat;

public class Admin 
{
	private FileIO accountIO = new FileIO();
	private Scanner scan = new Scanner (System.in);
	private Date today = new Date();
	private int menuNum = 0; 
	
	/*Admin 생성자*/
	public Admin(){

		introMessage();
		while (menuNum != 6)
		{
			printMenu();
/*
			while (!scan.hasNextInt()) {
				System.out.println("Please enter a number!");
				scan.nextLine();
			}
*/	 
			isInteger();
			menuNum = Integer.parseInt(scan.nextLine());
			
			switch(menuNum){
				case 1:	 // 계좌를 생성한다.
					createAccount();
					break;
				case 2:	 // 계좌를 삭제한다.
					deleteAccount();
					break;
				case 3:	 // 모든 계좌 정보를 보여준다.
					displayAccountsInfo();	// (Account뒤에 s가 붇어요)
					break;
				case 4:	 // 고객계좌로 입금한다.
					debit();
					break;
				case 5: // 고객계좌에서 출금한다.
					credit();
					break;
				// 6 이면 종료(PHIBank에서 처리)
			}// end of switch(menuNum)

		}// end of while (menuNum != 6)
		
	}
	/* intro message를 출력한다. */
	public void introMessage(){
		
		System.out.println("");
		System.out.println("Admin Mode: START [ " + today.toString() + " ]");
		System.out.println("안녕하세요! 관리자님 좋은 하루입니다~");
	}

	public void printMenu(){
		System.out.println("");
		
		System.out.println("원하시는 기능의 번호를 입력한 후 Enter를 눌러주세요!");
		System.out.println("[1] 계좌 생성");
		System.out.println("[2] 계좌 삭제");
		System.out.println("[3] 모든 계좌 정보 보기");
		System.out.println("[4] 계좌 입금");
		System.out.println("[5] 계좌 출금");
		System.out.println("[6] 프로그램 종료");
		System.out.println("");
		System.out.print(" > ");
	}
	
	/* 1] Create New Account : 계좌 생성 */
	public int createAccount(){

		Account newAccount = new Account();
		System.out.println("---> 계좌를 생성합니다. 각 항목에 해당하는 정보를 조건에 맞게 입력해주세요. ");
		System.out.println("*) 상위 메뉴로 돌아가려면 '.'을 입력하세요. ");
		
		boolean isIdUsed = true;
		boolean isIdValid = false;
		String id;
		do{
			System.out.print(">> ID : ");
			id = scan.nextLine();
			// 아이디 유효성 검사(checkId 함수 수정)
			isIdValid = checkId(id);
			isIdUsed = accountIO.isIdUsed(id);
			if (id.equals(".")){
				return 0;
			}
		} while (isIdUsed == true || isIdValid == false);
		newAccount.setId(id);
		
		String pw;
		boolean isPwValid = false;
		do{
			System.out.print(">> 비밀번호 : ");
			pw = scan.nextLine();
			isPwValid = checkPw(pw);
			if (pw.equals(".")){
				return 0;
			}
		} while( isPwValid == false);
		newAccount.setPw(pw);
		
		//System.out.print("비밀번호 확인: "); - 일단 보류(세부 기능이므로)

		System.out.print(">> 이름 : ");
		String name = scan.nextLine();
		newAccount.setName(name);
		if (name.equals(".")){
				return 0;
		}
		
		System.out.println(">> 주민등록번호 : \n(*하이픈을 함께 입력하세요! ex) 901212-2584101)");
			// 주민등록번호 유효성검사 - 일단 보류(세부 기능이므로)
		String regNum = scan.nextLine();
		newAccount.setRegisterNum(regNum);
		if (regNum.equals(".")){
				return 0;
		}
		System.out.println(">> 주소 : (* 한 줄에 입력하세요!)");
		String addr = scan.nextLine();
		newAccount.setAddress(addr);
		if (addr.equals(".")){
				return 0;
		}
		// 계좌번호 자동생성
		String accountNum = createAccountNum();
		newAccount.setAccountNum(accountNum);
		System.out.println("---> "+name+ "님의 계좌번호가 생성되었습니다.");
		System.out.println("---> 계좌번호 : " + accountNum);
		newAccount.setCreatedDate(today);
		
		System.out.print(">> 초기 잔액(\\) : ");
		isInteger();
		int balance = Integer.parseInt(scan.nextLine());
		newAccount.setBalance(balance);

		accountIO.accountWrite(newAccount);
		System.out.println("---> "+ name+ "님의 계좌 생성이 완료되었습니다.");
		System.out.println("");
		return 0;
	}//end of createAccount
	
		// 계좌번호 생성하여 반환
	public String createAccountNum(){
		
		DecimalFormat formatter = new DecimalFormat("000000");
		String accountNum = ""; 
		accountNum += formattedDate(today, "yyMMdd");
		accountNum +=  "-01-";
		accountNum +=  formatter.format(accountIO.getTotalIdNum()+1);

		return accountNum;
	}
	
	public String formattedDate(Date date, String format)
	{
		SimpleDateFormat toFormat = new SimpleDateFormat(format);
		return toFormat.format(date);
	}
	
	public boolean checkId(String id)
	{
		// boolean isIdValid = false;
		if (id.length() == 0){
			System.out.println("아이디를 입력하세요.");
			// isIdValid = false;
			return false;
		}
		if (id.length() < 4 || id.length() > 16){
			System.out.println("아이디를 4-12자로 입력해주세요.");
			// isIdValid = false;
			return false;
		} else {
			if(!Pattern.matches("^[a-z0-9]*$", id)){
				System.out.println("영문(소문자), 숫자만 쓸 수 있습니다.");
				// isIdValid = false;
				return false;
			}
			// isIdValid = true;
			return true;
		}
	}//end of checkId
	
	
	public boolean checkPw(String pw)
	{
		//boolean isPwValid = false;
	
		if (pw.length() == 0) {
			System.out.println("비밀번호를 입력하세요!");
			return false;
		}
		
		if (pw.length() < 8 && pw.length() > 16) {
			System.out.println("8자리 이상 16자리 이하의 비밀번호를 입력하세요.");
			return false;	
		} else {
			//if( pw.length() >= 8 && pw.length() <= 16)
			if(! Pattern.matches("^[a-z0-9]*$", pw)) {
				System.out.println("영문(소문자), 숫자만 쓸 수 있습니다.");
				return false;
			}
			// 정상
			return true;
		}
	}// end of checkPw
		

	/* 2] Delete an Account : 계좌 삭제 */
	public int deleteAccount(){
		System.out.println("*) 상위 메뉴로 돌아가려면 '.'을 입력하세요. ");
		System.out.println("---> 계좌를 삭제합니다. 삭제하고자 하는 계좌의 계좌번호를 입력하세요. ");
		

		String deleteAccountNum = scan.nextLine();
		// Account Number의 유효성 검사 - 추후에 구현
		if (deleteAccountNum.equals(".")){
			return 0;
		}
		accountIO.accountDelete(deleteAccountNum);
		return 0;
	}

	/* 3] Display the information of all accounts : 계좌 정보보기 */
	public void displayAccountsInfo(){
				
		accountIO.displayAllAccounts();
		// File[] memberFiles = accountIO.getMemberFiles();
	}

	/* 4] Debit Customer's Account : 계좌 입금 */
	public int debit(){
		System.out.println("*) 상위 메뉴로 돌아가려면 '.'을 입력하세요. ");
		System.out.println("---> 입금할 계좌번호를 입력하세요.");
		System.out.print(">> 계좌번호 : " );
		// Account Number의 유효성 검사 - 추후에 구현
		String accountNum = scan.nextLine();
		if (accountNum.equals(".")){
			return 0;
		}
		System.out.println("---> 입금할 금액을 입력하세요.");
		System.out.print(">> 금액(\\) : " );
		isInteger();
		int value = Integer.parseInt(scan.nextLine());
		Account account = accountIO.accountRead(accountNum);
		account.setBalance(account.getBalance() + value);
		accountIO.accountWrite(account);
		System.out.println("---> [" + accountNum + "]에 " + value +"원이 입금되었습니다.");
		return 0;
	}// end of debit

	/* 5] Credit Customer's Account : 계좌 출금 */
	public int  credit(){
		System.out.println("*) 상위 메뉴로 돌아가려면 '.'을 입력하세요. ");
		System.out.println("---> 출금할 계좌번호를 입력하세요.");

		System.out.print(">> 계좌번호 : " );
		// Account Number의 유효성 검사 - 추후에 구현
		String accountNum = scan.nextLine();
		if (accountNum.equals(".")){
			return 0;
		}
		System.out.println("---> 출금할 금액을 입력하세요.");
		System.out.print(">> 금액(\\) : " );
		isInteger();
		int value = Integer.parseInt(scan.nextLine());
		Account account = accountIO.accountRead(accountNum);
		int balance = account.getBalance();
		if (balance < value){
			System.out.println("---> 잔액이 모자랍니다. 거래가 종료됩니다.");
			return 1;
		}
		account.setBalance(balance - value);
		accountIO.accountWrite(account);
		System.out.println("---> [" + accountNum + "]에서 " + value +"원이 출금되었습니다.");
		return 0;
	}// end of credit

	
	public void isInteger(){ 
		while (!scan.hasNextInt()) {
			System.out.println("Please enter a number!");
			scan.nextLine();
		}
	}// end of isInteger
	
	 public char lower(char ch){
		if(ch<='A' && ch<='Z')
			return (char) ((char) ch+32);
	  return ch;
	 }//end of lower
	 
	 public boolean isAlph(char ch){
	  if(ch>='A' && ch<='Z'||ch>='a' && ch<='z') //&&연산이 ||연산보다 먼저 연산한다
	   return true;
	  return false;
	  }//end of isAlph
	 
	 
	 public boolean isNumber(char ch){
	  if(ch>='0' && ch<='9')
	   return true;
	  return false;
	 }//end of isNumber
}

